let shakeInfo = {
    openFlag: false,// 是否开启摇一摇，*****注意：如果是小程序全局监听摇一摇，这里默认为true
    shakeSpeed: 60,//设置阈值,越小越灵敏
    timer : null,
    shakeStep: 800,//摇一摇成功后间隔
    shakeOffset : 100,//摇动间隔
    lastTime: 0,//此变量用来记录上次摇动的时间
    diffTime : 0,
    //第一次成功时间
    firstTime : 0,
    //第二次成功时间
    secondTime : 0,
    offsetTime : 0,
    x: 0,
    y: 0,
    z: 0,
    lastX: 0,
    lastY: 0,
    lastZ: 0, //此组变量分别记录对应 x、y、z 三轴的数值和上次的数值
    //开始和结束次数
    shakeNum : 0,
    //停止次数
    stopNum :0,
};

function openShakeEvent() {
    shakeInfo.openFlag = true;
}

function closeShakeEvent() {
    shakeInfo.openFlag = false;
}

function shakeOk() {
    if(shakeInfo.timer){
        clearTimeout(shakeInfo.timer)
    }
    closeShakeEvent();
    shakeInfo.timer = setTimeout(function () {
        openShakeEvent();
    }, shakeInfo.shakeStep);
}
/**
 * 判断是否为摇一摇
 */
function shake(acceleration, successCallback) {
    if (!shakeInfo.openFlag) {
        return;
    }
    //console.log(shakeInfo);
    var nowTime = new Date().getTime(); //记录当前时间
    //如果这次摇的时间距离上次摇的时间有一定间隔 才执行
    if (nowTime - shakeInfo.lastTime > shakeInfo.shakeOffset && shakeInfo.shakeNum == 0) {
        
        shakeInfo.diffTime = nowTime - shakeInfo.lastTime; //记录时间段
        shakeInfo.lastTime = nowTime; //记录本次摇动时间，为下次计算摇动时间做准备
        shakeInfo.x = acceleration.x; //获取 x 轴数值，x 轴为垂直于北轴，向东为正
        shakeInfo.y = acceleration.y; //获取 y 轴数值，y 轴向正北为正
        shakeInfo.z = acceleration.z; //获取 z 轴数值，z 轴垂直于地面，向上为正
        //计算 公式的意思是 单位时间内运动的路程，即为我们想要的速度
        var speed = Math.abs(shakeInfo.x + shakeInfo.y + shakeInfo.z - shakeInfo.lastX - shakeInfo.lastY - shakeInfo.lastZ) / shakeInfo.diffTime * 10000;
        console.log(speed)
        if (speed > shakeInfo.shakeSpeed) { //如果计算出来的速度超过了阈值，那么就算作用户成功摇一摇
            console.log("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
            shakeInfo.shakeNum = 1
            shakeInfo.firstTime = new Date().getTime();
            successCallback()
        }
        console.log("########################################")
        shakeInfo.lastX = shakeInfo.x; //赋值，为下一次计算做准备
        shakeInfo.lastY = shakeInfo.y; //赋值，为下一次计算做准备
        shakeInfo.lastZ = shakeInfo.z; //赋值，为下一次计算做准备
    }else if(nowTime - shakeInfo.lastTime > parseInt(shakeInfo.shakeOffset / 2) && shakeInfo.shakeNum == 1){
        shakeInfo.diffTime = nowTime - shakeInfo.lastTime; //记录时间段
        shakeInfo.lastTime = nowTime; //记录本次摇动时间，为下次计算摇动时间做准备
        shakeInfo.x = acceleration.x; //获取 x 轴数值，x 轴为垂直于北轴，向东为正
        shakeInfo.y = acceleration.y; //获取 y 轴数值，y 轴向正北为正
        shakeInfo.z = acceleration.z; //获取 z 轴数值，z 轴垂直于地面，向上为正
        //计算 公式的意思是 单位时间内运动的路程，即为我们想要的速度
        var speed = Math.abs(shakeInfo.x + shakeInfo.y + shakeInfo.z - shakeInfo.lastX - shakeInfo.lastY - shakeInfo.lastZ) / shakeInfo.diffTime * 2 * 10000;
        console.log(speed)
        if (speed < shakeInfo.shakeSpeed) {//速度小于临界值则加1
            if(shakeInfo.stopNum == 0){
                shakeInfo.secondTime = new Date().getTime();
            }
            shakeInfo.stopNum += 1
        }else{//一次超速，前面作废
            shakeInfo.stopNum = 0
        }
        if(shakeInfo.stopNum == 5){//连续5次才算停止
            console.log("@@@@@@@@@@@@@@@@ 5 次 停 止 @@@@@@@@@@@@@@@@@@@@");
            shakeInfo.shakeNum = 0
            shakeInfo.stopNum = 0
            shakeInfo.offsetTime = shakeInfo.secondTime - shakeInfo.firstTime
            //成功后下次摇动需要间隔多少秒才可以
            shakeOk()
            successCallback()
        }
        shakeInfo.lastX = shakeInfo.x; //赋值，为下一次计算做准备
        shakeInfo.lastY = shakeInfo.y; //赋值，为下一次计算做准备
        shakeInfo.lastZ = shakeInfo.z; //赋值，为下一次计算做准备
    }
    console.log("数字是多少" + shakeInfo.shakeNum);
    console.log(nowTime - shakeInfo.lastTime);
    
}

module.exports = {
    shakeInfo,
    shake,
    shakeOk,
    openShakeEvent,
    closeShakeEvent
}